package uebung11;

import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

public class InteractiveChart extends BarChart
implements TemperatureClient, InteractiveChartTestInterface {
  
  /**
   * Stores a list with up to 30 measurements for each location.
   * This list is used to compute the average temperature 
   * for this location.
   */
  private HashMap tempHistoryPerLocation = new HashMap();

  /**
   * Alphabetically sorted list of all locations.
   * This variable is needed, as the keys in the 
   * tempHistoryPerLocation map are not ordered. Whenever
   * a measurement from a new location is received this 
   * list needs to be re-sorted.  
   */
  private LinkedList<String> allLocations = new LinkedList<String>();
  
  /**
   * Stored for testing purposes
   */
  private Map lastDiagramData;

  /**
   * Record for storing measurements from temperature sensors
   */
  class Measurement {
    Measurement(long t, String l, double temp) {
      time = t;
      location = l;
      temperature = temp;
    }
    public long time;
    public String location;
    public double temperature;
  }

  /**
   * returns the locations of the last diagram
   *
   * @return the locations used for the last displayed diagram
   */
  public LinkedList getLastDiagramLocations() {
    return allLocations;
  }

  /**
   * returns the data used for the last diagram
   *
   * @return the data used for the last displayed diagram
   */
  public Map getLastDiagramData() {
    return lastDiagramData;
  }

  /**
   * Called whenever a new temperature is measured by a sensor.
   *
   * @param timestamp The time when the measurement was taken, given 
   * in microseconds since 1.1.1970
   * @param location The location where the measurement was taken
   * @param temperature The measured temperature
   */
  public void newTemperature(long timestamp, String location,
                             double temperature) {
    //TODO bitte implementieren gemaess den Vorgaben auf der Uebung
    // Neue "locations" sollen in die Liste aufgenommen werden,
    // die fuer sie gemessenen Werte sind entsprechend passend
    // zu speichern (Tipp: sehen Sie sich die Attribute dieser Klasse an).
    // Zusaetzlich sollen die Orte alphabetisch geordnett und diese Ordnung
    // "geeignete Art und Weise" beim Zeichnen beruecksichtigt werden
    // (die daten von Raum "A" kommen als Balken vor denen von Raum "B").
    // Neben bzw. anstelle der zuletzt fuer den jeweiligen ort gemessenen 
    // Temperatur soll auch der Durchschnitt angezeigt fuer diesen Ort
    // berechnet werden, begrenzt auf den Durchschnitt der letzten 30
    // Messwerte.
    // Hinweis: bearbeiten Sie die Aufgabe schrittweise und testen Sie
    // zwischendrin immer wieder, ob die Ausgabe plausibel ist.

    // TODO implement
    println(location + ": " + temperature);
                
    allLocations = null;
    lastDiagramData = null;
                
 //   b.displayDiagram(, 10, ar);
  }
  
  /**
   * Open a new window and start the TemperatureTicker.
   * Do not change this method!
   *
   * @param args command line parameters are not used in this exercise
   */
  public static void main(String[] args) {
    InteractiveChart chart = new InteractiveChart();
    chart.start();
    
    //start the temperature ticker
    TemperatureTicker.initSensor(chart);
  }
}
